/*
 * Copyright 2004-2005 asoft
 * 本软件及其所有拷贝的名称，与光盘上或本软件中注明的公司同在。
 * 本软件及文档享有版权，并受国家版权法及国际协约条款的保护。
 * 您不可以从本软件中去掉其版权声明；并保证为本软件的拷贝（本部或部分）* 复制版权声明。
 * 您同意制止以任何形式非法拷贝本软件及文档。
 * 版权信息参见：
 *      http://www.asoft.cn/licenses
 */

package com.asoft.common.basedata.model;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.Vector;

import com.asoft.common.base.model.BaseObject;
import com.asoft.common.sysframe.model.User;
import com.asoft.examonline.exammanager.model.ExamQuestion;

/**
 * <p>Title: 类别</p>
 * <p>Description: TransferObject </p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company: asoft</p>
 * @ $Author: author $
 * @ $Date: 2004/12/17 13:54:17 $
 * @ $Revision: 1.4 $
 * @ created in 2006-11-13
 *
 */

public class Type extends BaseObject
                       implements Serializable
{
        private Type superType;
        
        private String name;

        private String remark;

        private Set subTypes;
        
        private Set<ExamQuestion> examQuestions;

        /**
         * 构造函数
         */
        public Type()
        {
                // for hibernate
        }
        
        public Type(String code,
                    String name)
        {
                this.code = code;
                this.name = name;
                this.remark = "";
        }
        
        public Type(Type superType,
                    String code,
                    String name,
                    String remark)
        {
                super();
                // TODO 自动生成构造函数存根
                this.superType = superType;
                this.code = code;
                this.name = name;
                this.remark = remark;
        }
        
        public Type(Type superType,
                    String code,
                    String name,
                    User creator)
        {
                super();
                // TODO 自动生成构造函数存根
                this.superType = superType;
                this.code = code;
                this.name = name;
                this.remark = "";
                this.setCreator(creator);
                this.setCreateOrg(creator.getFirstOrg());
                this.setCreateTime(new Timestamp((new Date()).getTime()));
                this.setLastUpdator(creator);
                this.setLastUpdateOrg(creator.getFirstOrg());
                this.setLastUpdateTime(new Timestamp((new Date()).getTime()));
        }

        /**
         * @return 返回 name。
         */
        public String getName()
        {
                return name;
        }

        /**
         * @param name 要设置的 name。
         */
        public void setName(String name)
        {
                this.name = name;
        }

        /**
         * @return 返回 remark。
         */
        public String getRemark()
        {
                return remark;
        }

        /**
         * @param remark 要设置的 remark。
         */
        public void setRemark(String remark)
        {
                this.remark = remark;
        }

        /**
         * @return 返回 subTypes。
         */
        public Set getSubTypes()
        {
                return subTypes;
        }

        /**
         * @param subTypes 要设置的 subTypes。
         */
        public void setSubTypes(Set subTypes)
        {
                this.subTypes = subTypes;
        }

        /**
         * @return 返回 superType。
         */
        public Type getSuperType()
        {
                return superType;
        }

        /**
         * @param superType 要设置的 superType。
         */
        public void setSuperType(Type superType)
        {
                this.superType = superType;
        }

        // 添加子节点
        public void addSubType(Type type)
        {
                if(this.subTypes == null)
                {
                        this.subTypes = new LinkedHashSet();
                }
                this.subTypes.add(type);
        }

        /** 获取所有子孙节点 */
        public List getAllSubTypes()
        {
                return this.getAllSubTypes(this);

        }
        /** 递归获取子孙节点model */
        private List getAllSubTypes(Type parentType)
        {
                List tsubTypes = new Vector(parentType.getSubTypes());
                List allSubTypes = new Vector();
                allSubTypes.addAll(tsubTypes);
                if(tsubTypes.size() != 0)
                {

                        for(int i = 0; i <tsubTypes.size(); i ++)
                        {
                                Type type = (Type)tsubTypes.get(i);
                                allSubTypes.addAll(this.getAllSubTypes(type));
                        }
                }
                return allSubTypes;
        }

        /**
         * @return examQuestions
         */
        public Set<ExamQuestion> getExamQuestions()
        {
                return examQuestions;
        }

        /**
         * @param examQuestions 要设置的 examQuestions
         */
        public void setExamQuestions(Set<ExamQuestion> examQuestions)
        {
                this.examQuestions = examQuestions;
        }

        /** 采用框架提供的操作日志必须填写的项目 */
        public void setModeldetail()
        {
                this.setModelFieldDetail("id",this.getId());
                this.setModelFieldDetail("代码",this.code);
                this.setModelFieldDetail("名称",this.name);
                this.setModelFieldDetail("优先级",this.pri);
        }
}
